package com.HeJing.实例变量赋值过程_JavaBean_UML类图.方法的相关应用.递归方法;

/**
 * ClassName: RecursionTest
 * Package: com.HeJing.方法的相关应用.递归方法
 * Description:
 *
 * @Author: HeJing
 * @Create: 2023-03-23 20:17
 * @Version: 1.0
 */
public class RecursionTest {
    // 汉诺塔移动盘子的执行次数
    public static int hannuo_times;

    public static void main(String[] args) {
        RecursionTest test = new RecursionTest();
//        test.method01();

        // 汉诺塔测试:
        test.hanNuoTa(3, 'A', 'B', 'C');
    }

    // 这种方法是是错误的，会造成栈内存溢出
   /* public void method01() {
        System.out.println("method01()....");
        method01();
    }*/


    /**
     * 举例1: 计算1-100内自然数的和
     */
    public int getSumNumber(int num) {
        if (num > 1) {
            return num + getSumNumber(num - 1);
        }else {
            return 1;
        }

    }

    /**
     * 举例2: 计算 n!
     */
    public int getSumMulti(int n) {
        if (n == 1) {
            return n;
        }else {
            return n * getSumNumber(n - 1);
        }
    }

    /**
     * 举例3: 快速排序
     */

    /**
     * 举例4: 汉诺塔问题, 将盘子按照一定的顺序从A移动到C(具体细节不描述了，忘了就上网查)
     * 注意， 盘子的编号从上到下从1开始依次增加
     */
    public void hanNuoTa(int n, char A, char B, char C) {
        if (n == 1) {
            move(n, A, C);
        } else {
            // 把上层的n - 1 个盘子借助C移动到中转站B
            hanNuoTa(n - 1, A, C, B);
            // 把最大的一个从A移动到C
            move(n, A, C);
            // 把中转站B上的n - 1个盘子借助A移动到C
            hanNuoTa(n - 1, B, A, C);
        }
    }

    /**
     * 移动盘子的函数
     */
    public void move(int diskid, char start, char end) {
        System.out.println("第" + (++hannuo_times) + "次执行操作: 将盘子" + diskid + "从" + start + "移动到" + end);
    }
}













